using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

namespace Beaker.OpenCube.Resources
{
	public class TextureFrameMetadataConverter
		: JsonConverter
	{
		/// <summary>
		/// Writes the JSON representation of the object.
		/// </summary>
		/// <param name="writer">The <see cref="T:Newtonsoft.Json.JsonWriter"/> to write to.</param><param name="value">The value.</param><param name="serializer">The calling serializer.</param>
		public override void WriteJson( JsonWriter writer, object value, JsonSerializer serializer )
		{
			throw new NotImplementedException();
		}

		/// <summary>
		/// Reads the JSON representation of the object.
		/// </summary>
		/// <param name="reader">The <see cref="T:Newtonsoft.Json.JsonReader"/> to read from.</param><param name="objectType">Type of the object.</param><param name="existingValue">The existing value of object being read.</param><param name="serializer">The calling serializer.</param>
		/// <returns>
		/// The object value.
		/// </returns>
		public override object ReadJson( JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer )
		{
			List<TextureFrameMetadata> metaFrames = new List<TextureFrameMetadata>();

			JArray array = JArray.Load( reader );
			foreach( JToken item in array )
			{
				JValue value = item as JValue;
				if( value != null )
				{
					if( value.Type == JTokenType.Integer )
						metaFrames.Add( new TextureFrameMetadata( value.Value<int>() ) );
				}

				JObject obj = item as JObject;
				if( obj != null )
				{
					int index = (int)obj.Property( "index" ).Value;
					int time = (int)obj.Property( "time" ).Value;
					metaFrames.Add( new TextureFrameMetadata( index, time ) );
				}
			}

			return metaFrames;
		}

		/// <summary>
		/// Determines whether this instance can convert the specified object type.
		/// </summary>
		/// <param name="objectType">Type of the object.</param>
		/// <returns>
		/// <c>true</c> if this instance can convert the specified object type; otherwise, <c>false</c>.
		/// </returns>
		public override bool CanConvert( Type objectType )
		{
			return objectType == typeof( TextureFrameMetadata );
		}
	}
}